package com.dux.commons.network.packet;

import java.nio.ByteBuffer;


/**
 * 发送出去的数据包
 * @author 杜祥
 * @create 2013-6-1
 */
public class SendablePacket extends AbstractPacket
{
	
	/**
	 * 构造一个新的数据包，并设置操作码。
	 * 
	 * @param opcode
	 *            packet opcode.
	 */
	protected SendablePacket(int opcode)
	{
		super(PacketType.SERVER, opcode);
	}

	/**
	 * 构造一个新的数据包.<br>
	 * 如果使用此构造函数，然后必须使用 {@link #setOpcode(int)}设置操作码
	 */
	protected SendablePacket()
	{
		super(PacketType.SERVER);
	}
	
	/**
	 * 向缓冲流中写入一个int型数据
	 * 
	 * @param buffer
	 * @param value
	 */
	protected final void writeInt(ByteBuffer buffer, int value)
	{
		buffer.putInt(value);
	}

	/**
	 * 向缓冲流中写入一个short型数据
	 * 
	 * @param buffer
	 * @param value
	 */
	protected final void writeShort(ByteBuffer buffer, int value)
	{
		buffer.putShort((short) value);
	}

	/**
	 * 向缓冲流中写入一个byte型数据
	 * 
	 * @param buffer
	 * @param value
	 */
	protected final void writeByte(ByteBuffer buffer, int value)
	{
		buffer.put((byte) value);
	}

	/**
	 * 向缓冲流中写入一个double型的数据
	 * 
	 * @param buffer
	 * @param value
	 */
	protected final void writeDouble(ByteBuffer buffer, double value)
	{
		buffer.putDouble(value);
	}

	/**
	 * 向缓冲流中写入一个float型的数据
	 * 
	 * @param buffer
	 * @param value
	 */
	protected final void writeFloat(ByteBuffer buffer, float value)
	{
		buffer.putFloat(value);
	}

	/**
	 * 向缓冲流中写入一个long型数据
	 * 
	 * @param buffer
	 * @param value
	 */
	protected final void writeLong(ByteBuffer buffer, long value)
	{
		buffer.putLong(value);
	}

	/**
	 * 向缓冲流中写入一个字符串
	 * 
	 * @param buffer
	 * @param text
	 */
	protected final void writeString(ByteBuffer buffer, String text)
	{
		if(text == null)
		{
			buffer.putChar('\000');
		}
		else
		{
			final int len = text.length();
			for(int i = 0; i < len; i++)
				buffer.putChar(text.charAt(i));
			buffer.putChar('\000');
		}
	}

	/**
	 * 向缓冲流中写入一个字节数组
	 * 
	 * @param buffer
	 * @param data
	 */
	protected final void writeBytes(ByteBuffer buffer, byte[] data)
	{
		buffer.put(data);
	}
}
